'''

生成器对象是一种可迭代对象

生成器是一种特殊的迭代器，它通过 `yield` 关键字来实现。生成器的运行原理可以总结如下：

1. 生成器函数：
   - 生成器函数是一个包含 `yield` 关键字的函数。
   - 当调用生成器函数时，它不会立即执行函数体，而是返回一个生成器对象。

2. 生成器对象：
   - 生成器对象是一个迭代器，它实现了 `__iter__()` 和 `__next__()` 方法。
   - 生成器对象的状态会在每次调用 `next()` 时保存，并在下一次调用时从上次离开的地方继续执行。

3. `yield` 关键字：
   - 当生成器函数执行到 `yield` 语句时，它会暂停执行，并将 `yield` 后面的值返回给调用者。
   - 生成器的状态（包括局部变量和指令指针）会被保存，以便在下次调用 `next()` 时从暂停的地方继续执行。

4. 迭代过程：
   - 每次调用 `next()` 时，生成器会从上次暂停的地方继续执行，直到遇到下一个 `yield` 语句或函数结束。
   - 如果生成器函数执行完毕（即没有更多的 `yield` 语句），会抛出 `StopIteration` 异常，表示生成器已经耗尽。

5. 示例代码分析：
   - 在 `generator_func()` 中，每次调用 `next(g)` 时，生成器会执行到下一个 `yield` 语句并返回相应的值。
   - 当所有 `yield` 语句执行完毕后，再调用 `next(g)` 会抛出 `StopIteration` 异常。

def generator_func():
    yield 1
    yield 2
    print('hello world')
    yield 3

g = generator_func()
print(next(g))  # 输出 1
print(next(g))  # 输出 2
print(next(g))  # 输出 'hello world' 和 3
try:
    print(next(g))  # 抛出 StopIteration 异常
except StopIteration:
    print("Generator is exhausted")

总结：生成器通过 `yield` 关键字实现惰性求值，每次调用 `next()` 时生成器会从上次暂停的地方继续执行，
直到生成器函数结束。这种机制使得生成器在处理大数据集或无限序列时非常高效。

'''
from collections.abc import Iterator


# 生成器函数
def generator_func():
    yield 1
    yield 2
    print('hello world')
    yield 3

if __name__ == '__main__':
    g = generator_func()
    print(g)
    print(isinstance(g,Iterator))
    print(next(g)) # 输出 1
    print(next(g)) # 输出 2
    print(next(g)) # 输出 'hello world' 和 3
    try:
        print(next(g)) # 抛出 StopIteration 异常
    except StopIteration:
        print("Generator is exhausted")


